home *** CD-ROM | disk | FTP | other *** search
- /*
- IC IconSuites.c
-
-
- */
-
- #include <Limits.h>
- #include <Icons.h>
-
- #include "IC Globals.h"
- #include "IC Misc Subs.h"
-
- #include "IC IconSuites.h"
-
- CacheRecord cache[cache_max+1];
- long usage;
- Handle default_application_suite;
- Handle default_document_suite;
-
- Byte icon_buffer[1024];
-
- Boolean GetTheIcon(DTPBRec* pbdt,SignedByte icon_to_get,OSType fcreator,OSType ftype,short dtrn){
- pbdt->ioDTRefNum=dtrn;
- pbdt->ioTagInfo=0;
- pbdt->ioIconType=icon_to_get;
- pbdt->ioFileCreator=fcreator;
- pbdt->ioFileType=ftype;
- return PBDTGetIconSync(pbdt)==noErr;
- }
-
- OSErr GetDTDBIcon(OSType ftype,OSType fcreator,short* cookie,SignedByte icon_to_get,DTPBRec* pbdt){
- OSErr oe;
- short i;
- Boolean found=false;
- Str63 junk;
- short vrefnum;
- long crdate;
-
- if (System7){
- if (*cookie==0){
- i=1;
- oe=noErr;
- do {
- vrefnum=0;
- junk[0]=0;
- oe=ICGetVolInfo(junk,&vrefnum,i,&crdate);
- i++;
- if (oe==noErr){
- pbdt->ioNamePtr=(StringPtr)0;
- pbdt->ioVRefNum=vrefnum;
- oe=PBDTGetPath(pbdt);
-
- if (oe==noErr){
- if (GetTheIcon(pbdt,icon_to_get,fcreator,ftype,pbdt->ioDTRefNum)){
- *cookie=pbdt->ioDTRefNum;
- found=true;
- }
- }
- oe=noErr;
- }
- } while ((!found)&&(oe==noErr));
- } else
- found=GetTheIcon(pbdt,icon_to_get,fcreator,ftype,*cookie);
- }
- if (found)
- oe=noErr;
- else
- oe=afpItemNotFound;
-
- return oe;
- }
-
- OSErr GetDTDBIconH(OSType ftype,OSType fcreator,short* cookie,SignedByte icon_to_get,Handle* iconh){
- DTPBRec dtpb;
- OSErr err;
-
- *iconh=(Handle)0;
- dtpb.ioDTBuffer=(char*)icon_buffer;
- dtpb.ioDTReqCount=sizeof(Byte)*1024;
-
- err=GetDTDBIcon(ftype,fcreator,cookie,icon_to_get,&dtpb);
- if (err==noErr)
- err=PtrToHand((Ptr)icon_buffer,iconh,dtpb.ioDTActCount);
-
- if (err!=noErr){
- DisposeHandle(*iconh);
- *iconh=(Handle)0;
- } else
- MoveHHi(*iconh);
-
- return err;
- }
-
- OSErr GetDTDBAddSuite(Handle suite,OSType ftype,OSType fcreator,short* cookie,SignedByte icon_to_get,OSType icon_to_put){
- OSErr err;
- Handle iconh;
-
- err=GetDTDBIconH(ftype,fcreator,cookie,icon_to_get,&iconh);
-
- if (err==noErr)
- err=AddIconToSuite(iconh,suite,icon_to_put);
-
- if (err!=noErr){
- DisposeHandle(iconh);
- }
-
- return err;
- }
-
- OSErr GetDTDBIconSuiteUncached(OSType ftype,OSType fcreator,Handle* suite){
- OSErr err;
- short cookie;
-
- *suite=(Handle)0;
- err=NewIconSuite(suite);
- if (err==noErr){
- cookie=0;
- if (GetDTDBAddSuite(*suite,ftype,fcreator,&cookie,kLargeIcon,large1BitMask)==noErr){
- GetDTDBAddSuite(*suite,ftype,fcreator,&cookie,kLarge4BitIcon,large4BitData);
- GetDTDBAddSuite(*suite,ftype,fcreator,&cookie,kLarge8BitIcon,large8BitData);
- } else
- err=afpItemNotFound;
- }
-
- if (err!=noErr){
- if (*suite!=(Handle)0){
- DisposeIconSuite(*suite,true);
- *suite=(Handle)0;
- }
- } else
- MoveHHi(*suite);
-
- return err;
- }
-
- OSErr GetDTDBIconSuiteCached(OSType ftype,OSType fcreator,Handle* suite){
- OSErr err=(OSErr)-1;
- short i,j;
- long m;
-
- *suite=(Handle)0;
-
- for (i=0;i<cache_max;i++){
- if ((cache[i].usage>0)&&((cache[i].ftype==ftype)&&(cache[i].fcreator==fcreator))){
- *suite=cache[i].suite;
- err=noErr;
- cache[i].usage++;
- usage++;
- return err;
- }
- }
-
- if (err!=noErr){
- m=LONG_MAX;
- for (i=0;i<cache_max;i++){
- if (cache[i].usage<m){
- j=i;
- m=cache[i].usage;
- }
- }
- err=GetDTDBIconSuiteUncached(ftype,fcreator,suite);
- if (err==noErr){
- if (m>0)
- DisposeIconSuite(cache[j].suite,true);
- cache[j].suite=*suite;
- cache[j].ftype=ftype;
- cache[j].fcreator=fcreator;
- cache[j].usage=usage;
- usage++;
- }
- }
-
- if ((err==noErr)&&(*suite==(Handle)0))
- err=resNotFound;
-
- if (err!=noErr){
- *suite=default_document_suite;
- if ((ftype=='APPL')&&(default_application_suite!=(Handle)0))
- *suite=default_application_suite;
- }
-
- return err;
- }
-
- void InitICIconSuites(void){
- short i;
-
- for (i=0;i<cache_max;i++)
- cache[i].usage=-1;
-
- default_application_suite=(Handle)0;
- default_document_suite=(Handle)0;
-
- if (System7){
- if (GetIconSuite(&default_document_suite,kDocSuiteID,svAllLargeData)!=noErr)
- default_document_suite=(Handle)0;
- if (GetIconSuite(&default_application_suite,kAppSuiteID,svAllLargeData)!=noErr)
- default_application_suite=(Handle)0;
- }
- }
-
-